 /****************************************************************************\
* @file     DriverBoard.h
* @author   傅帅
* @date     2019/1/4
* @brief    C610/620驱动板主逻辑
*
******************************************************************************
* @attent  
****************************************************************************/
#ifndef DRIVER_BOARD_H
#define DRIVER_BOARD_H

#include "pid.h"
#include "Config.h"

#define MAX_TX_LEN 100
#define MAX_RX_LEN 100

typedef enum{
    USART_ONE = configUSART_ONE,
    USART_TWO = configUSART_TWO
}eUsart_t;

typedef enum{
    POS,
    VEL,
    CUR
}eControlState_t;

typedef struct _Motor_t{
    struct _Motor_t *pNext;     // 下个电机结构体
    eUsart_t Usart;             // 被哪个串口(One or Two)管理
    uint8_t MotorIndex;         // 电机编号
    PID_t PID_Vel;              // 速度环PID结构体
    PID_t PID_Pos;              // 位置环PID结构体
    uint16_t ZeroCounts;        // 逻辑零位时的计数
    int32_t MinSafePos;         // 最小安全位置
    int32_t MaxSafePos;         // 最大安全位置
    /* 实时更新的一些变量 */
    eControlState_t ControlState;   // 当前进行位置/速度/电流控制
    int32_t CurPos;             // 当前位置(总和)[Counts]
    int16_t CurRelativePos;     // C610/620返回的绝对霍尔传感器的Counts
    int16_t CurVel;             // 当前速度      [Counts/s]
    int16_t CurTorque;          // 当前转矩      [和发送电流时的单位定义相同]
    int16_t CurrentSet;         // 电流模式下暂存电流设置值,映射关系见驱动器手册
    int16_t LastCounts;         // 上一帧的Counts, 用于结合速度计算总圈数( 两个串口Motor_t链表头用该变量表示挂在此链表上的电机数n )
    int16_t Circles;            // 当前转过的总圈数,用于计算总Pos( 两个串口Motor_t链表头用该变量表示当前帧应上发到主控的电机在链表中的下标[0~n-1] )
}Motor_t;

void DriverBoardMainLoop(void);
void DriverBoardInit(void);
#endif
